block1 Remix を使ってスマートコントラクトをデプロイしてみよう
はじめに
ブラウザがあればスマートコントラクトの開発からデプロイまで一気通貫で行うことが可能です。
今回はそのツールの紹介と、簡易的な NFT のスマートコントラクトを作ってテストネットへのデプロイを行い、そのスマートコントラクトの状態を取得したり、実際に NFT を発行することを体験していただきます。
ゴール
NFT のスマートコントラクトを書いてデプロイし、実際にインタラクションする!
スマートコントラクトの実装内容は理解しなくて OK です!(コピペできるコードを用意済み)
概要
事前準備
Browser でスマートコントラクトを開発することができる Remix の紹介 NFT スマートコントラクトを Remix 上で書いてみよう!
Remix VM 上にデプロイして、状態を参照したり mint してみたりしよう!
テストネットにデプロイして、状態を参照したり mint してみたりしよう!
事前準備
block0 事前準備 に記載のあるブラウザで MetaMask ブラウザエクステンションをインストールしよう MetaMask => Settings => Advanced => Show test networks
テストネットワークの情報の表示を ON にします
自分のアドレスを下記に記載しておいてください。後ほどテスト用のネイティブトークンを配布します。
faucet を利用しネイティブトークンを取得することも可能です。 tachibana: 0x199012076Ea09f92D8C30C494E94738CFF449f57
piyo.eth: 0xA632f917bC8AcF34b547372715e9d846aF1A28b7
先ほどのアドレスに 0.1 ETH ずつ送付済みです!
NFT スマートコントラクトを Remix 上で書いてみよう!
実際に画面を共有しながらライブコーディングを行っていきます。
Remix を MetaMask Extention が入った chrome のブラウザで開いてください。 ブラウザエディタが起動します。
画面左の contracts ディレクトリをクリックして中身が見えている状態で、その上の「Create New File」ボタンを押して新しいファイルを作成します。名前は「Web3Tokyo.sol」にしましょう。
エディタがそのファイルを開きます。そのファイル上に下記のコードをコピペしてください。
コピペすると警告がでますが今回は気にせずOKしてください。
code:Web3Tokyo.sol
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.17;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
contract Web3Tokyo is ERC721Enumerable{
// 親のコンストラクタを呼び出し
// NFT のトークン名、トークンシンボルを設定
constructor () ERC721("WEB3TOKYO", "W3T") {}
// msg.sender にトークンを発行する関数
function mint() external {
mintTo(msg.sender);
}
// beneficiary に設定されたアドレスにトークンを発行する関数
function mintTo(address beneficiary) public {
_safeMint(beneficiary, totalSupply() + 1);
}
}
Mac だと ⌘S でファイルの保存とコードのコンパイルが走ります。
今回はコントラクトの実装については詳しく言及しませんが簡単に説明すると
ERC-721(NFT)のコントラクトのスマートコントラクトを定義しており、
openzeppelin が提供している ERC721Enumerable という ERC-721 に便利な機能が追加されたコントラクトのテンプレートを利用し、それを継承したスマートコントラクトになっています。そして独自に mint、mintTo という関数を定義しています。
その他、親の ERC721Enumerable がたくさんの関数や状態を定義しているので、気になる方は
$ import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
のERC721Enumerable.solを⌘ボタンを押しながらクリックしてください。コードジャンプし、中身のファイルを確認することができます。
Remix VM 上にデプロイして、状態を参照したり mint してみたりしよう!
コンパイルが成功したら、実際に Remix の VM に試しにデプロイしてみましょう
Remix VM は実際のブロックチェーンではなく Remix が用意した仮想環境なのでトランザクションを実行する際に gas 代はかかりません。
さくっとスマートコントラクトのコードを書いてテストしたい時などに便利です。
画面左の Deploy & Run transactions をクリックしてください
https://scrapbox.io/files/63d4bfe956765b001d88606e.png
CONTRACT (Compiled by Remix) が Web3Tokyo.sol になっていることを確認してください。
Deoloy ボタンを押下してください。
Deploy ボタンをおすと Deployed Contracts にデプロイ済みのコントラクトが表示されます
https://scrapbox.io/files/63d4c0d9e6c620001d073673.png
> をクリックして、実際にどういった関数や状態を持つスマートコントラクトが VM 上にデプロイされたか確認してください。
黄色いボタンが実際にトランザクションを発行する関数です。実行するためにはトランザクション手数料が必要になり、深い青色のボタンはブロックチェーン上の状態を確認する getter など、ブロックチェーンの状態を変更しない関数です。
定義した mint、mintTo という関数の存在が確認できると思います。
その他の関数はすべて継承したコントラクトが持っている関数や状態です。
実際に totalSupply を実行して 0 が返ってくることを確認してください。
次に mint を実行し、そしてまた totalSupply を実行して 1 が返ってくることを確認してください。
本来はトランザクション実行時に手数料が必要になりますが、Remix VM では必要ありません。
実際にさわって遊んでみてください!
その間に、テストネットでのトランザクションに必要なネイティブトークンをみなさんのアドレスに送付します。
テストネット上にデプロイして、状態を参照したり mint してみたりしよう!
次に実際にテストネットにデプロイをしてみましょう!
デプロイ方法は先程と同じですが今回は MetaMask を利用し、MetaMask が管理しているアドレスを利用してデプロイします。
これまで Remix VM が選択されていた ENVIRONMENT で Injected Provider - MetaMask を選択してください。
下記のように MetaMask のポップアップが現れます。許可していきましょう!
https://scrapbox.io/files/63d4db0e82c44e001d845666.png
次に MetaMask のエクステンションをクリックし、ネットワークを Goerli に変更します。
ネットワーク選択部分をクリックし、Goerli を選択してください。
https://scrapbox.io/files/63d4dbbc5ee6e60023c37269.png
先程みなさんのアドレス宛に GoerliETH を少額配ったので配られているか確認してください。
それでは先程同様に Deploy ボタンを押してください。
CONTRACT (Compiled by Remix) が Web3Tokyo.sol になっていることを事前に確認してください。
先程との違いは、トランザクションが発生するため MetaMask のポップアップが現れます。MetaMask 上でコントラクトデプロイのためのトランザクション実行を承認する必要があります。この際、手数料として GoerliETH が少額消費されます。
https://scrapbox.io/files/63d4dcdc1e7a45001ee09174.png
トランザクションが取り込まれたら、デプロイされたコントラクトの関数を実行してみましょう!
totalSupply を実行して 0 が返ってくることを確認してください。
次に mint を実行しましょう!
先程とは違い、実際にトランザクションが発生するため MetaMask のポップアップが現れ、トランザクションを承認する必要があります。
トランザクションが取り込まれたら totalSupply を実行して 1 が返ってくることを確認してください。
時間があれば
近くにいる人のアドレスを教えてもらって、mintTo 関数の beneficiary にそのアドレスを設定して NFT を送ってみよう。
Next